/**************************************************************************************

                                        _ooOoo_                                                           
                                       o8888888o                                                          
                                       88" . "88                                                          
                                       (| -_- |)                                                          
                                       O\  =  /O                                                          
                                    ____/`---'\____                                                       
                                  .'  \\|     |\\  `.                                                     
                                 /  \\|||  :  |||//  \                                                    
                                /  _||||| -:- |||||-  \                                                   
                                |   | \\\  -  /// |   |                                                   
                                | \_|  ''\---/''  |   |                                                   
                                \  .-\__  `-`  ___/-. /                                                   
                              ___`. .'  /--.--\  `. . __                                                  
                           ."" '<  `.___\_<|>_/___.'  >'"".                                               
                           | | :  `- \`.;`\ _ /`;.`/ - ` : | |                                            
                          \  \ `-.   \_ __\ /__ _/   .-` /  /                                             
                     ======`-.____`-.___\_____/___.-`____.-'======                                        
                                        `=---='                                                           
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                         
                                佛祖保佑        永无BUG                                                    

**---------------------------------File Info-------------------------------------------
**                                                                                                        
** @file:               vga_driver_lx.v
** @author:             LeXin567567
** @date:               2024-06-26
** @brief:              
** @prblems: 1. 为什么要有 vga_reg 这个设计没搞懂            
**                                                                                                        
**-------------------------------------------------------------------------------------
**************************************************************************************/

module vga_driver_lx (
    input vga_clk,
    input sys_rst_n,
    input [15:0] pixel_data,

    output vga_hs,
    output vga_vs,
    output [15:0]   vga_rgb,
    output [10:0] pixel_xpos,
    output [10:0] pixel_ypos,
    output data_req
);

/*
//640*480 60FPS_25MHz
parameter  H_SYNC   =  10'd96;    //行同步
parameter  H_BACK   =  10'd48;    //行显示后沿
parameter  H_DISP   =  10'd640;   //行有效数据
parameter  H_FRONT  =  10'd16;    //行显示前沿
parameter  H_TOTAL  =  10'd800;   //行扫描周期

parameter  V_SYNC   =  10'd2;     //场同步
parameter  V_BACK   =  10'd33;    //场显示后沿
parameter  V_DISP   =  10'd480;   //场有效数据
parameter  V_FRONT  =  10'd10;    //场显示前沿
parameter  V_TOTAL  =  10'd525;   //场扫描周期
*/

//1024*768 60FPS_65MHz
parameter  H_SYNC   =  11'd136;   //行同步     
parameter  H_BACK   =  11'd160;   //行显示后沿
parameter  H_DISP   =  11'd1024;  //行有效数据
parameter  H_FRONT  =  11'd24;    //行显示前沿
parameter  H_TOTAL  =  11'd1344;  //行扫描周期  注意位宽长度,需要11位的位宽

parameter  V_SYNC   =  11'd6;     //场同步
parameter  V_BACK   =  11'd29;    //场显示后沿
parameter  V_DISP   =  11'd768;   //场有效数据
parameter  V_FRONT  =  11'd3;     //场显示前沿
parameter  V_TOTAL  =  11'd806;   //场扫描周期


reg [10:0] cnt_v;
reg [10:0] cnt_h;

wire vga_en;

assign vga_hs = (cnt_h <= H_SYNC - 1'b1) ? 1'b0 : 1'b1;
assign vga_vs = (cnt_v <= V_SYNC - 1'b1) ? 1'b0 : 1'b1;


assign vga_en = (cnt_h >= H_SYNC + H_BACK && cnt_h < H_SYNC + H_BACK + H_DISP 
                && cnt_v >= V_SYNC + V_BACK && cnt_v < V_SYNC + V_BACK + V_DISP)
                ? 1'b1 : 1'b0;

assign vga_rgb = vga_en ? pixel_data : 16'b0;


// 请求象数点的数据输入
assign data_req = (cnt_h >= H_SYNC + H_BACK -1'b1 && cnt_h < H_SYNC + H_BACK + H_DISP -1'b1
                && cnt_v >= V_SYNC + V_BACK && cnt_v < V_SYNC + V_BACK + V_DISP)
                ? 1'b1 : 1'b0;


// pixel_xpos and pixel_ypos are the position of the pixel
assign pixel_xpos = data_req ? cnt_h - H_SYNC - H_BACK + 1 : 11'b0;
assign pixel_ypos = data_req ? cnt_v - V_SYNC - V_BACK + 1 : 11'b0;

// here cnt_h is used tu count the horizontal position of the pixel
always @(posedge vga_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt_h <= 11'b0;
    else if(cnt_h == H_TOTAL - 1)
        cnt_h <= 11'b0;
    else
        cnt_h <= cnt_h + 1;
end

// here cnt_v is used to count the vertical position of the pixel
always @(posedge vga_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        cnt_v <= 11'b0;
     else if(cnt_h == H_TOTAL - 1'b1) 
        if(cnt_v < V_TOTAL - 1'b1)                                               
            cnt_v <= cnt_v + 1'b1;                               
        else 
            cnt_v <= 10'd0;  
end

endmodule